﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using BattleCity;
using Fiuba.Algo3.Titiritero.Vista;
using Fiuba.Algo3.Titiritero;
using LibreriaDeClases;

namespace BattleCity
{
    public delegate void DelegadoUser();
    public class TanqueUser : Tanque
    {
        //Atributos
        private void nada() { }
        public event DelegadoUser UserDestruido;

        private Arma canion;
        private Arma lanzaCohetes;
        private IDireccion direccion = new Detenido();
        private IDireccion apuntar = new Izquierda();
        override public IDireccion Direccion
        {
            get
            {
                return apuntar;
            }
        }

        //Constructor (Singleton)
        private TanqueUser()
        {
            //Deberia sacar el punto de un arcihvo de config
            Point p1 = new Point(200, 200);
            this.Figura = new Rectangulo(p1,30,30);
            this.energia = 100;
            this.Velocidad = 7;
            this.arma = new Ametralladora();
            this.canion = new Canion();
            this.lanzaCohetes = new LanzaCohetes();
            this.nombre = "TanqueUser";
            UserDestruido += new DelegadoUser(nada);
        }
        private static TanqueUser tanque = null;
              
        public static TanqueUser getTanqueUser()
        {
            if (tanque == null)
            {
                tanque = new TanqueUser();
            }
            return tanque;
        }
        public static void Reset()
        {
            tanque = null;
        }

        //Metodos
        public void posicionInicial(Point posicion)
        {
            this.Figura = new Rectangulo(posicion,30,30);
        }
        override public void Vivir()
        {
            int i = 0;
            while (this.energia > 0 && i < this.Velocidad)
            {
                this.Avanzar();
                Escenario.getEscenario().DetectarImpacto(this);
                i++;
            }
        }
        override public int getPuntos()
        {
            return 20;
        }
        public void AvanzarArriba()
        {
            direccion = new Arriba();
            apuntar = direccion;
        }
        public void AvanzarAbajo()
        {
            direccion = new Abajo();
            apuntar = direccion;
        }
        public void AvanzarDerecha()
        {
            direccion = new Derecha();
            apuntar = direccion;
        }
        public void AvanzarIzquierda()
        {
            direccion = new Izquierda();
            apuntar = direccion;
        }
        public void NoAvanzar()
        {
            direccion = new Detenido();
        }


        public void AtacarConAmetralladora()
        {
            arma.DispararManual(this.Figura.getCentro(), this.apuntar);
            
        }
        public void AtacarConCanion()
        {
            canion.DispararManual(this.Figura.getCentro(), this.apuntar);
        }
        public void AtacarConLanzaCohetes()
        {
            lanzaCohetes.DispararManual(this.Figura.getCentro(), this.apuntar);
        }
        
        override protected IDireccion DireccionAvanzar()
        {

            return direccion;
        }
        override protected IDireccion DireccionRetroceder()
        {
            IDireccion direccionAux = new Detenido();
            if(direccion.EsArriba())
            {
                direccionAux = new Abajo();
            }
            else if (direccion.EsDerecha())
            {
                direccionAux = new Izquierda();
            }
            else if (direccion.EsAbajo())
            {
                direccionAux = new Arriba();
            }
            else if (direccion.EsIzquierda())
            {
                direccionAux = new Derecha();
            }
            return direccionAux;
        }
        
        override public void Daniar(int danio)
        {
            this.energia = this.energia - danio;

            if (this.energia <= 0)
            {
                Escenario.getEscenario().Objetos.Remove(this);
                Point ubicacion = new Point();
                ubicacion = this.Figura.getUbicacion();
                Explosion unaExplosion = new Explosion(ubicacion);
                Escenario.getEscenario().Objetos.Add(unaExplosion);
                UserDestruido();
            }
        }

        override public bool ImpactaCon(Arma armaGanada)
        {
            this.arma.CargarMuniciones(armaGanada);
            this.canion.CargarMuniciones(armaGanada);
            this.lanzaCohetes.CargarMuniciones(armaGanada);
            Escenario.getEscenario().Objetos.Remove(armaGanada);
            return true;
        }
        override public bool ImpactaCon(BonusVida bonus) 
        {
            this.energia += 50;
            Escenario.getEscenario().Objetos.Remove(bonus);
            return true;
        }
        override public bool ImpactaCon(BonusVelocidad bonus)
        {
            this.Velocidad += 2;
            Escenario.getEscenario().Objetos.Remove(bonus);
            return true;
        }
       
        
    
    }
}
